package dbclass;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import classes.DbClass;

import beans.Comentario;
import beans.Imagem;
import beans.Noticia;
import beans.Video;
import beans.Voto;


public class NoticiaJDBC implements NoticiaDAO{	

	private Connection con;
	
	
	public Noticia insert(Noticia noticia) throws SQLException, ClassNotFoundException
	{
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		int check =  stm.executeUpdate("INSERT INTO noticia (id, titulo, corpo, data, id_autor, id_categoria) VALUES (" +
				"NULL, '" + noticia.getTitulo() + "', '" + noticia.getCorpo() + "', '" + noticia.getData() + "', '" + noticia.getId_autor()+ "', '" + noticia.getId_categoria()+ "')");
		 
		ResultSet rs_insert = stm.executeQuery("select id from noticia order by id desc");
		rs_insert.next();
		noticia.setId(rs_insert.getLong("id"));
	    
		if(check != 0)
		{
			return noticia;
		}	  
		return null;	
	}
	
	public Noticia update(Noticia noticia) throws SQLException, ClassNotFoundException
	{
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		boolean check = stm.execute("UPDATE noticia SET titulo = '" + noticia.getTitulo() + "', corpo = '" + noticia.getCorpo() +
				"', data = '" + noticia.getData() + "', id_autor = '" + noticia.getId_autor() + "', id_categoria = '" + noticia.getId_categoria() +
				"' WHERE id = '" + noticia.getId() + "'");
		
		if(check)
		{
			return noticia;
		}	
		return null;
	}

	public boolean delete(long id) throws ClassNotFoundException, SQLException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		boolean check = stm.execute("DELETE FROM noticia WHERE id = '" + id + "' LIMIT 1");
		return check;
	}

	public List<Noticia> findAll() throws SQLException, ClassNotFoundException {
		List<Noticia> noticiaes = new ArrayList<Noticia>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT n.*,c.nome as nome_categoria,a.nome as nome_autor FROM noticia n, categoria c, autor a WHERE n.id_categoria = c.id and a.id = n.id_autor   ");
		
		while (result.next()) {
			
			Noticia noticia = new Noticia(result.getLong(1), result.getString(2), result.getString(3), result.getString(4), 
					result.getLong(5), result.getLong(6));
			
			TagDAO tagdao = new TagJDBC();
			
			 
            noticiaes.add(noticia);
        }		
		return noticiaes; 
	}


	public List<Noticia> findAll(long id_categoria) throws SQLException, ClassNotFoundException {
		List<Noticia> noticiaes = new ArrayList<Noticia>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result; 
		result = stm.executeQuery("SELECT n.*,c.nome as nome_categoria,a.nome as nome_autor FROM noticia n, categoria c, autor a WHERE n.id_categoria = c.id and a.id = n.id_autor and id_categoria = '"+id_categoria+"' order by id desc  ");
		
		while (result.next()) {
			
			Noticia noticia = new Noticia(result.getLong(1), result.getString(2), result.getString(3), result.getString(4), 
					result.getLong(5), result.getLong(6));

            noticiaes.add(noticia); 
        }		
		return noticiaes; 
	}
	
	//Utilizada para mostrar apenas uma noticia
	public Noticia findById(long id) throws SQLException, ClassNotFoundException {
		Noticia noticia = null;
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		ResultSet result;
		result = stm.executeQuery("SELECT n.*,c.nome as nome_categoria,a.nome as nome_autor FROM noticia n, categoria c, autor a WHERE n.id = '" + id + "' and n.id_categoria = c.id and a.id = n.id_autor   ");
		
		while (result.next()) {
			
			noticia = new Noticia(result.getLong(1), result.getString(2), result.getString(3), result.getString(4), 
					result.getLong(5), result.getLong(6));
			

        }	
		
		return noticia; 
	}

	//Pega todas as imagens de uma noticia,na tabela noticia_imagem
	public List<Imagem> getImages(long id) throws SQLException, ClassNotFoundException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT i.id,i.titulo,i.url FROM imagem i WHERE id in  (select id_imagem from  noticia_imagem where id_noticia = '" + id + "') ");
		  
		List<Imagem> imagens = new ArrayList<Imagem>();
		while (result.next()) {
			Imagem imagem = new Imagem(result.getLong("id"),result.getString("url"), result.getString("titulo"));
			imagens.add(imagem); 
        }	
		 
		return imagens;
	}
	//Recupera todos os comentarios de uma noticia, na tabela noticia_comentario
	public List<Comentario> getComentarios(long id) throws SQLException, ClassNotFoundException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT c.id_noticia,c.id,c.corpo,c.data FROM comentario c WHERE   id_noticia = '" + id + "'  ");
		  
		List<Comentario> comentarios = new ArrayList<Comentario>();
		while (result.next()) {
			Comentario comentario = new Comentario(result.getLong("id"),result.getString("corpo"), result.getString("data"),result.getLong("id_noticia"));
			comentarios.add(comentario); 
        }	
		 
		return comentarios;
	}
	
	//Recupera todos os videos de uma noticia
	public List<Video> getVideos(long id) throws SQLException, ClassNotFoundException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT i.id,i.titulo,i.url FROM video i WHERE id in  (select id_video from  noticia_video where id_noticia = '" + id + "') ");
		  
		List<Video> videos = new ArrayList<Video>();
		while (result.next()) {
			Video video = new Video(result.getLong("id"),result.getString("url"), result.getString("titulo"));
			videos.add(video); 
        }	
		 
		return videos;
	}
	
	//Recupera todas as notas e retorna a media 
	public long getNota(long id) throws SQLException, ClassNotFoundException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		VotoDAO votoDAO = new VotoJDBC();
		return votoDAO.avg(id);
	} 
	
	//Adiciona uma imagem a noticia
	public Imagem insertImage(long id_noticia, long id_imagem)
			throws SQLException, ClassNotFoundException {
		ImagemDAO imagemDAO = new ImagemJDBC();
		Imagem imagem = imagemDAO.findById(id_imagem);
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		stm.execute("INSERT INTO noticia_imagem (id_noticia, id_imagem) VALUES ('" +
				id_noticia + "', '" + id_imagem + "')");
		
		return imagem;
	}

	//Adiciona um video a noticia
	@Override
	public Video insertVideo(long id_noticia, long id_video) throws SQLException,
			ClassNotFoundException {
		
		VideoDAO videoDAO = new VideoJDBC();
		Video video = videoDAO.findById(id_video);
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		stm.execute("INSERT INTO noticia_video (id_noticia, id_video) VALUES ('" +
				id_noticia + "', '" + id_video + "')");
		
		return video;
	}
	

	//Delete uma imagem de uma noticia
	@Override
	public boolean deleteImage(long id_noticia, long id_imagem)
			throws SQLException, ClassNotFoundException {
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		boolean check = stm.execute("DELETE FROM noticia_imagem WHERE id_noticia = '" + id_noticia + "' AND id_imagem = '" +
				id_imagem + "' LIMIT 1");
		
		return check;
	}
	
	//Deleta um video da noticia
	public boolean deleteVideo(long id_noticia, long id_video)
			throws SQLException, ClassNotFoundException {
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
 
		int check = stm.executeUpdate("DELETE FROM noticia_video WHERE id_noticia = '" + id_noticia + "' AND id_video = '" +
				id_video + "' LIMIT 1");

		if(check > 0)
			return true;
		return false;
	}

	@Override
	public List<Comentario> findAllComentarios(long id) throws SQLException,
			ClassNotFoundException {
		
		List<Comentario> comentarios = new ArrayList<Comentario>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT * FROM noticia WHERE id_autor = '" + id + "')");
		
		while (result.next()) {
			Comentario comentario = new Comentario(result.getLong(1), result.getString(2), result.getString(3), result.getLong(4));
			comentarios.add(comentario); 	
        }		
		return comentarios;
	}
	

	@Override
	public List<Voto> findAllVotos(long id) throws SQLException,
			ClassNotFoundException {
		
		List<Voto> votos = new ArrayList<Voto>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT * FROM tag WHERE id_noticia = '" + id + "')");
		
		while (result.next()) {
			Voto voto = new Voto(result.getLong(1), result.getString(2), result.getInt(3), result.getLong(4));
			votos.add(voto);
        }		
		return votos;
	}

	@Override
	public List<Imagem> findAllImagens(long id) throws SQLException,
			ClassNotFoundException {
		List<Imagem> imagens = new ArrayList<Imagem>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT n.id_noticia,v.id, v.url, v.titulo  FROM imagem v, noticia_imagem n	 WHERE v.id = n.id_imagem AND n.id_noticia =  '" + id + "' "); 
 
		
		while (result.next()) {
			Imagem imagem = new Imagem(result.getLong("id"), result.getString("url"), result.getString("titulo"));
			imagens.add(imagem);
        }		
		return imagens; 
	}

	@Override
	public List<Video> findAllVideos(long id) throws SQLException,
			ClassNotFoundException {
		List<Video> videos = new ArrayList<Video>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result;
		result = stm.executeQuery("SELECT n.id_noticia,v.id, v.url, v.titulo  FROM video v, noticia_video n	 WHERE v.id = n.id_video AND n.id_noticia  = '" + id + "' "); 
		
		while (result.next()) { 
			Video video = new Video(result.getLong("id"), result.getString("url"), result.getString("titulo"));
			videos.add(video);
        }		
		return videos;
	}

	@Override
	public List<Noticia> findPalavra(String palavra) throws SQLException,
			ClassNotFoundException {
		List<Noticia> noticiaes = new ArrayList<Noticia>();
		
		con = DbClass.getConnection();
		Statement stm = con.createStatement();
		
		ResultSet result; 
		result = stm.executeQuery("SELECT n.*,c.nome as nome_categoria,a.nome as nome_autor FROM noticia n, categoria c, autor a WHERE n.id_categoria = c.id and a.id = n.id_autor and titulo like '%"+palavra+"%' order by id desc  ");
		
		while (result.next()) {
			
			Noticia noticia = new Noticia(result.getLong(1), result.getString(2), result.getString(3), result.getString(4), 
					result.getLong(5), result.getLong(6));

            noticiaes.add(noticia); 
        }		
		return noticiaes; 
	}

}